#include<bits/stdc++.h>
using namespace std;
using ll = long long;

/*
    题目描述;

	展开给定一个长度为 N 的整数序列: A1,A2,… AN。现在你有一次机会，将其中连续的 K 个数修改成任意一个相同值。
	
	请你计算如何修改可以使修改后的数列的最长不下降子序列最长，请输出这个最长的长度。

	最长不下降子序列是指序列中的一个子序列，子序列中的每个数不小于在它之前的数。

	【输入格式】
	 输入第一行包含两个整数 N 和 K
	 第二行包含 N 个整数 A1,A2,....,AN 。
	【输出格式】
	 输出一行包含一个整数表示答案。
*/

const int N = 1e5 + 10;
int a[N], dp[N], dpr[N], len;

int Find(int x)
{
	if (x >= dp[len - 1]) return -1;

	int l = 0, r = len - 1;
	while (l < r)
	{
		int mid = l + r >> 1;
		if (dp[mid] > x) r = mid;
		else l = mid + 1;
	}
	return l;
}

int main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int n, k, ret = 0;
	cin >> n >> k;
	for (int i = 0; i < n; ++i) cin >> a[i];

	if(k >= n) cout << n << "\n";
	else	
	{
		// dpr[i]: 以 i 位置开始的最长不下降子序列
		// 从右往左找不上升子序列 == 从左往右最长不下降子序列
		dp[len++] = a[n - 1], dpr[n - 1] = 1;
		for(int i = n - 2; i >= 0; --i)
		{
			if(a[i] <= dp[len - 1]) dp[len++] = a[i], dpr[i] = len;
			else
			{
				int l = 0, r = len - 1;
				while(l < r)
				{
					int mid = l + r >> 1;
					if(dp[mid] < a[i]) r = mid;
					else l = mid + 1;
				}
				dp[l] = a[i];
				dpr[i] = l + 1;
			}
		}

		// 从左往右枚举分割点
		len = 0;
		dp[len++] = a[0], ret = k + dpr[k];
		for(int i = 1, j = k + 1; j < n; ++i, ++j)
		{
			// 以 j 位置为结尾，最长不下降子序列的长度 left
			int idx = Find(a[j]);		
			int left = idx == -1 ? len : idx;

			// 以 j 为分割点的最长不下降子序列长度 = 左边 + k + 右边
			ret = max(ret, left + k + dpr[j]);

			// 二分贪心更新dp数组
			idx = Find(a[i]);
			if (idx == -1) dp[len++] = a[i];
			else dp[idx] = a[i];
		}
		// 以 n - k 结尾的最长不递减子序列 + k 成为最长不递减子序列的情况
		ret = max(ret, len + k);
		cout << ret << "\n";
	}
	return 0;
}